package com.example.utils;

import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

/**
 * @author zhangs
 * @version v1.0
 * @decription 同步屏障
 * @date 2021/3/30 23:23
 **/
public class CyclicBarrierDemo {
    static class Task extends Thread {
        CyclicBarrier cb;

        public Task(CyclicBarrier cb) {
            this.cb = cb;
        }

        @Override
        public void run() {
            try {
                TimeUnit.SECONDS.sleep(2);
                System.out.println(getName() + " 到达栅栏 A");
                cb.await();
                System.out.println(getName() + " 冲破栅栏 A");

                TimeUnit.SECONDS.sleep(2);
                System.out.println(getName() + " 到达栅栏 B");
                cb.await();
                System.out.println(getName() + " 冲破栅栏 B");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // CyclicBarrier的字面意思是可循环使用（Cyclic）的屏障（Barrier）
    public static void main(String[] args) {
        // 最后一个打达拦截点的线程会执行如下任务
        CyclicBarrier cb = new CyclicBarrier(3, () -> {
            System.out.println(Thread.currentThread().getName() + "完成最后任务");
        });
        for (int i = 0; i < 3; i++) {
            new Task(cb).start();
        }
    }
}
